package com.pay.sdk.service.channel1;

import java.util.HashMap;

import com.google.common.base.Strings;
import com.pay.sdk.service.ep.EpAuth;
import com.pay.sdk.service.ep.EpAuthCancel;
import com.pay.sdk.service.ep.EpAuthCheckSms;
import com.pay.sdk.service.ep.EpAuthPay;
import com.pay.sdk.service.ep.EpAuthQuery;
import com.pay.sdk.service.ep.EpAuthQuickSms;
import com.pay.sdk.service.ep.EpPay;
import com.pay.sdk.service.ep.EpQuery;
import com.pay.sdk.service.liquidation.XyBankCodeQuery;
import com.pay.sdk.service.liquidation.XyPay;
import com.pay.sdk.service.liquidation.XyQueryBalance;
import com.pay.sdk.service.pay.XyAlipayScanPay;
import com.pay.sdk.service.pay.XyPayQuery;
import com.pay.sdk.service.pay.XyWechatAppPay;
import com.pay.sdk.service.pay.XyWechatJsPay;
import com.pay.sdk.service.pay.XyWechatScanPay;

public class ChannelOnePay {
	
	 /**
     * 通道1支付宝扫码支付
     *
     * @param out_trade_no    【必填】商户订单号
     * @param total_fee  【必填】支付金额
     * @param body    【必填】订单描述
     * @param device_info    设备信息
     * @param notify_url 异步回调地址
     * @return json格式结果，返回结果包含字段请参看文档
     */
    public static String alipayScanPay(String out_trade_no, String total_fee, String body, String device_info,String notify_url) {
        HashMap<String, String> params = new HashMap<String, String>();
        if(Strings.isNullOrEmpty(out_trade_no)){
        	return "out_trade_no 不能为空";
        }
        if(Strings.isNullOrEmpty(total_fee)){
        	return "total_fee 不能为空";
        }
        if(Strings.isNullOrEmpty(body)){
        	return "body 不能为空";
        }
        params.put("out_trade_no", out_trade_no);
        params.put("total_fee", total_fee);
        params.put("body", body);
        params.put("device_info", device_info);
        params.put("notify_url", notify_url);
        return new XyAlipayScanPay().exec(params);
    }
    
    
    /**
     * 微信扫码支付
     *
     * @param out_trade_no    商户订单号
     * @param total_fee  支付金额
     * @param body    订单描述
     * @param device_info    设备信息
     * @return json格式结果，返回结果包含字段请参看文档
     */
    public static String wechatScanPay(String out_trade_no, String total_fee, String body, String device_info,String notify_url) {

        HashMap<String, String> params = new HashMap<String, String>();
        params.put("out_trade_no", out_trade_no);
        params.put("total_fee", total_fee);
        params.put("body", body);
        params.put("device_info", device_info);
        params.put("notify_url", notify_url);
        return new XyWechatScanPay().exec(params);
    }
    
    
    /**
     * 微信公众号支付
     *
     * @param out_trade_no    商户订单号
     * @param total_fee  支付金额
     * @param body    订单描述
     * @param sub_openid openid
     * @param notify_url 异步回调地址
     * @param device_info    设备信息
     * @return json格式结果，返回结果包含字段请参看文档
     */
    public static String wechatJsPay(String out_trade_no, String total_fee, String body, String sub_openid,String device_info,String notify_url) {

        HashMap<String, String> params = new HashMap<String, String>();
        params.put("out_trade_no", out_trade_no);
        params.put("total_fee", total_fee);
        params.put("body", body);
        params.put("sub_openid", sub_openid);
        params.put("body", sub_openid);
		params.put("notify_url",sub_openid);
        params.put("device_info", device_info);
        return new XyWechatJsPay().exec(params);
    }
    
    
    /**
     * 支付结果查询
     *
     * @param out_trade_no    商户订单号
     * @return json格式结果，返回结果包含字段请参看文档
     */
    public static String payQuery(String out_trade_no) {

        HashMap<String, String> params = new HashMap<String, String>();
        params.put("out_trade_no", out_trade_no);
        return new XyPayQuery().exec(params);
    }
    
    
    /**
     * 代笔代付
     * @param merchant_no 商户号
     * @param user_order_no 商户订单号
     * @param amount 金额 （元）
     * @param account_no 账号
     * @param account_name 帐户名
     * @param bank_code 银行代码
     * @param acct_type 对方账户类型：0-储蓄卡;1-信用卡;2-企业账户
     * @param usage 转账用途
     * @return
     */
	public static String liquidation( String user_order_no, String amount, String account_no,
			String account_name, String bank_code, String acct_type, String usage) {
		  HashMap<String, String> params = new HashMap<String, String>();
		  params.put("user_order_no", user_order_no);
		  params.put("amount", amount);
		  params.put("account_no", account_no);
		  params.put("account_name", account_name);
		  params.put("bank_code", bank_code);
		  params.put("acct_type", acct_type);
		  params.put("usage", usage);
		  return new XyPay().exec(params);
	}

	/**
	 * 单笔代付查询接口
	 * @param order_no
	 * @return
	 */
	public static String liquidationQuery(String order_no,String user_order_no) {
		HashMap<String, String> params = new HashMap<String, String>();
		params.put("order_no", order_no);
		params.put("user_order_no", user_order_no);
		return new com.pay.sdk.service.liquidation.XyPayQuery().exec(params);
	}

	
	/**
	 * 商户结算账号余额查询
	 * @return
	 */
	public static String queryBalance() {
		HashMap<String, String> params = new HashMap<String, String>();
		return new XyQueryBalance().exec(params);
	}


	/**
	 * 银行代码获取
	 * @return
	 */
	public static String bankCodeQuery() {
		HashMap<String, String> params = new HashMap<String, String>();
		return new XyBankCodeQuery().exec(params);
	}
	
	
	public static String appPay(String out_trade_no, String total_fee, String body, String device_info,String notify_url) {
	    HashMap<String, String> params = new HashMap<String, String>();
        params.put("out_trade_no", out_trade_no);
        params.put("total_fee", total_fee);
        params.put("body", body);
        params.put("device_info", device_info);
        params.put("notify_url", notify_url);
        return new XyWechatAppPay().exec(params);
	}
	
	
	/**
     * 快捷支付认证接口（异步接口）<br />
     * 该方法将生成跳转页面的全部HTML代码，商户直接输出该HTML代码至某个URL所对应的页面中，即可实现跳转，可以参考示例epay_redirect.jsp<br />
     * [重要]各传入参数SDK都不作任何检查、过滤，请务必在传入前进行安全检查或过滤，保证传入参数的安全性，否则会导致安全问题。
     *
     * @param trac_no    商户跟踪号
     * @param acct_type  卡类型：0-储蓄卡,1-信用卡
     * @param bank_no    人行联网行号
     * @param card_no    账号
     * @param user_name  姓名（可选，若为非null，则用户界面显示该值且不可输）
     * @param cert_no    证件号码（可选，若为非null，则用户界面显示该值且不可输）
     * @param card_phone 联系电话（可选，若为非null，则用户界面显示该值且不可输）
     * @param expireDate 信用卡有效期（仅信用卡有效，格式MMYY，可选，若为非null，则用户界面显示该值且不可输）
     * @param cvn        信用卡CVN（仅信用卡有效，可选，若为非null，则用户界面显示该值且不可输）
     * @return 跳转页面HTML代码
     */
    public static String epAuth(String trac_no, String acct_type, String bank_no, String card_no, String user_name, String cert_no, String card_phone, String expireDate, String cvn) {

        HashMap<String, String> params = new HashMap<String, String>();
        params.put("trac_no", trac_no);
        params.put("acct_type", acct_type);
        if (bank_no != null && !("".equals(bank_no)))
            params.put("bank_no", bank_no);
        params.put("card_no", card_no);

        if (user_name != null) params.put("user_name", user_name);
        if (cert_no != null) {
            params.put("cert_no", cert_no);
            params.put("cert_type", "0");
        }
        if (card_phone != null) params.put("card_phone", card_phone);

        if (expireDate != null) params.put("expireDate", expireDate);
        if (cvn != null) params.put("cvn", cvn);

        return new EpAuth().exec(params);
    }

    public static String epAuth(String trac_no, String acct_type, String bank_no, String card_no) {
        return epAuth(trac_no, acct_type, bank_no, card_no, null, null, null, null, null);
    }

    /**
     * 快捷支付认证接口（同步接口，需短信确认）
     *
     * @param trac_no    商户跟踪号
     * @param acct_type  卡类型：0-储蓄卡,1-信用卡
     * @param bank_no    人行联网行号
     * @param card_no    账号
     * @param user_name  姓名
     * @param cert_no    证件号码
     * @param card_phone 联系电话
     * @param expireDate 信用卡有效期（仅信用卡时必输，格式MMYY）
     * @param cvn        信用卡CVN（仅信用卡时必输）
     * @return json格式结果，返回结果包含字段请参看收付直通车代收接口文档
     */
    public static String epAuthSyncWithSms(String trac_no, String acct_type, String bank_no, String card_no, String user_name, String cert_no, String card_phone, String expireDate, String cvn) {

        HashMap<String, String> params = new HashMap<String, String>();
        params.put("trac_no", trac_no);
        params.put("acct_type", acct_type);
        if (bank_no != null && !("".equals(bank_no)))
            params.put("bank_no", bank_no);
        params.put("card_no", card_no);

        params.put("user_name", user_name);
        params.put("cert_no", cert_no);
        params.put("card_phone", card_phone);

        if (expireDate != null) params.put("expireDate", expireDate);
        if (cvn != null) params.put("cvn", cvn);

        return new EpAuthQuickSms().exec(params);
    }

    /**
     * 快捷认证短信验证码确认接口
     *
     * @param trac_no  发起同步认证时的商户跟踪号
     * @param sms_code 6位数字短信验证码
     * @return json格式结果，返回结果包含字段请参看收付直通车代收接口文档
     */
    public static String epAuthCheckSms(String trac_no, String sms_code) {

        HashMap<String, String> params = new HashMap<String, String>();
        params.put("trac_no", trac_no);
        params.put("sms_code", sms_code);

        return new EpAuthCheckSms().exec(params);
    }

    /**
     * 快捷支付账户解绑接口
     *
     * @param card_no 账号
     * @return json格式结果，返回结果包含字段请参看收付直通车代收接口文档
     */
    public static String epAuthCancel(String card_no) {

        HashMap<String, String> params = new HashMap<String, String>();
        params.put("card_no", card_no);

        return new EpAuthCancel().exec(params);
    }

    /**
     * 快捷支付账户认证结果查询接口
     *
     * @param trac_no 商户跟踪号
     * @return json格式结果，返回结果包含字段请参看收付直通车代收接口文档
     */
    public static String epAuthQuery(String trac_no) {

        HashMap<String, String> params = new HashMap<String, String>();
        params.put("trac_no", trac_no);

        return new EpAuthQuery().exec(params);
    }

    /**
     * 快捷支付交易接口
     *
     * @param order_no     订单号
     * @param order_amount 金额，单位元，两位小数，例：8.00
     * @param order_title  订单标题
     * @param order_desc   订单描述
     * @param card_no      支付卡号
     * @return json格式结果，返回结果包含字段请参看收付直通车代收接口文档
     */
    public static String epPay(String order_no, String order_amount, String order_title, String order_desc, String card_no,String order_time,String cur) {

        HashMap<String, String> params = new HashMap<String, String>();
        params.put("order_no", order_no);
        params.put("order_amount", order_amount);
        params.put("order_title", order_title);
        params.put("order_desc", order_desc);
        params.put("card_no", card_no);
        params.put("order_time", order_time);
        params.put("cur", cur);

        return new EpPay().exec(params);
    }

    /**
     * 快捷支付交易查询接口（查询指定日期）
     *
     * @param order_no   订单号
     * @param order_date 订单日期，格式yyyyMMdd
     * @return json格式结果，返回结果包含字段请参看收付直通车代收接口文档
     */
    public static String epQuery(String order_no, String order_date) {

        HashMap<String, String> params = new HashMap<String, String>();
        params.put("order_no", order_no);
        params.put("order_date", order_date);

        return new EpQuery().exec(params);
    }

    /**
     * 快捷支付交易查询接口（查询当天交易）
     *
     * @param order_no 订单号
     * @return json格式结果，返回结果包含字段请参看收付直通车代收接口文档
     */
    public static String epQuery(String order_no) {

        HashMap<String, String> params = new HashMap<String, String>();
        params.put("order_no", order_no);

        return new EpQuery().exec(params);
    }

   
    /**
     * 无绑定账户快捷支付跳转页面生成接口<br />
     * 该方法将生成跳转页面的全部HTML代码，商户直接输出该HTML代码至某个URL所对应的页面中，即可实现跳转，可以参考示例epay_redirect.jsp<br />
     * [重要]各传入参数SDK都不作任何检查、过滤，请务必在传入前进行安全检查或过滤，保证传入参数的安全性，否则会导致安全问题。<br />
     * 参数bank_no,acct_type,card_no需要全为null或者全不为null。
     *
     * @param order_no     订单号
     * @param order_amount 金额，单位元，两位小数，例：8.00
     * @param order_title  订单标题
     * @param order_desc   订单描述
     * @param remote_ip    客户端IP地址
     * @param bank_no      人行联网行号（可选，若为非null，则用户界面显示该值且不可输）
     * @param acct_type    卡类型：0-储蓄卡,1-信用卡（可选，若为非null，则用户界面显示该值且不可输）
     * @param card_no      账号（可选，若为非null，则用户界面显示该值且不可输）
     * @param user_name    姓名（可选，若为非null，则用户界面显示该值且不可输）
     * @param cert_no      证件号码（可选，若为非null，则用户界面显示该值且不可输）
     * @param card_phone   联系电话（可选，若为非null，则用户界面显示该值且不可输）
     * @param expireDate   信用卡有效期（仅信用卡有效，格式MMYY，可选，若为非null，则用户界面显示该值且不可输）
     * @param cvn          信用卡CVN（仅信用卡有效，可选，若为非null，则用户界面显示该值且不可输）
     * @return 跳转页面HTML代码
     */
    public static String epAuthPay(String order_no,String order_time, String order_amount, String order_title, String order_desc, String remote_ip,
                                   String bank_no, String acct_type, String card_no, String user_name, String cert_no, String card_phone, String expireDate, String cvn) {

        HashMap<String, String> params = new HashMap<String, String>();
        params.put("order_no", order_no);
        params.put("order_amount", order_amount);
        params.put("order_title", order_title);
        params.put("order_desc", order_desc);
        params.put("order_ip", remote_ip);
        params.put("order_time", order_time);

        if (bank_no != null) params.put("bank_no", bank_no);
        if (acct_type != null) params.put("acct_type", acct_type);
        if (card_no != null) params.put("card_no", card_no);
        if (user_name != null) params.put("user_name", user_name);
        if (cert_no != null) {
            params.put("cert_no", cert_no);
            params.put("cert_type", "0");
        }
        if (card_phone != null) params.put("card_phone", card_phone);
        if (expireDate != null) params.put("expireDate", expireDate);
        if (cvn != null) params.put("cvn", cvn);

        return new EpAuthPay().exec(params);
    }

    public static String epAuthPay(String order_no,String order_time, String order_amount, String order_title, String order_desc, String remote_ip) {
        return epAuthPay(order_no,order_time, order_amount, order_title, order_desc, remote_ip, null, null, null, null, null, null, null, null);
    }
	

}
